﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Grishko.DataTier;
using OutdoorLib.Context;
using Grishko.SerilizeTools;

namespace OutdoorLib.WS
{
    public class ws_SingleObectFactory
    {
        private static ws_SingleObectFactory _ws_SingleObectFactory=null;
        
        public static ws_SingleObectFactory GetFactory()
        {
            if (null == _ws_SingleObectFactory)
                _ws_SingleObectFactory = new ws_SingleObectFactory();

            return _ws_SingleObectFactory;
        }

        private ws_SingleObectFactory(){}
        /// <summary>
        /// Вернуть объект. Создает объект на базе TagName - если объект не новый - прогружае его из ранилища
        /// </summary>
        /// <param name="ObjectId"></param>
        /// <returns></returns>
        public virtual EntitySingle GetObject(string ID,string TagName)
        {
       
            //Это новый объект
            EntitySingle result = GetNewObject(TagName);            
            if (AgencyLib_GlobalConstants.IsNewRecord(ID))
                                            return result;

            //Объект в кэше
            if (CacheTools.IsCacheObject(ID))
            {
                EntitySingle r= (EntitySingle)CacheTools.GetCacheObect(ID);                
                return r;
            }

            //объекта в кэше нет и не новый
                try
                {
                    result.ID = ID;
                    result.Load();
                    result.PropertyLoad();
                    CacheTools.SetCacheObject(ID, result);
                }
                catch
                {
                    throw new Exception(string.Format("Не могу прогрузить объект. TagName={0}, ObjectId={1}",
                                                       new string[] { TagName, ID }));
                }            
            
                return result;
            
        }

        public virtual EntitySingle GetNewObject(string TagName)
        {
            EntitySingle result = new EntitySingle();

            result = (EntitySingle)EntityActivator.CreateInstance__(TagName);

            if (null == result)
                throw new Exception(string.Format("Не могу создать объект. TagName={0}", TagName));
            
            
            
            
            return result;

        }

        /// <summary>
        /// insert update - асинхронно 
        /// delete - синхронно 
        /// </summary>
        /// <param name="Obj"></param>
        /// <returns></returns>
        public virtual EntitySingle SaveObject(EntitySingle Obj)
        {
            Obj.Save();
            return Obj;

        }

        public virtual EntitySingle SaveWitchChild(EntitySingle Obj)
        {
            Obj.SaveWitchChild ();
            return Obj;

        }

        public virtual EntitySingle UpdateObject(EntitySingle Obj)
        {
            Obj.Save();
            return Obj;

        }

    }
}
